package com.yunke.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yunke.entity.YunkeMenu;
import com.yunke.entity.vo.YunkeMenuVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 菜单Mapper接口
 * 
 * @author yunke
 * @since 1.0.0
 */
@Mapper
public interface YunkeMenuMapper extends BaseMapper<YunkeMenu> {

    /**
     * 根据菜单编码查询菜单
     */
    YunkeMenu selectByMenuCode(@Param("menuCode") String menuCode);

    /**
     * 查询菜单列表
     */
    List<YunkeMenuVo> selectMenuList(@Param("menuName") String menuName,
                                    @Param("menuType") Integer menuType,
                                    @Param("enabled") Boolean enabled);

    /**
     * 根据ID查询菜单详情
     */
    YunkeMenuVo selectMenuVoById(@Param("id") Long id);

    /**
     * 根据管理员ID查询菜单列表
     */
    List<YunkeMenuVo> selectMenusByAdminId(@Param("adminId") Long adminId);

    /**
     * 根据角色ID列表查询菜单
     */
    List<YunkeMenuVo> selectMenusByRoleIds(@Param("roleIds") List<Long> roleIds);

    /**
     * 根据父ID查询子菜单
     */
    List<YunkeMenuVo> selectByParentId(@Param("parentId") Long parentId);

    /**
     * 查询所有父菜单
     */
    List<YunkeMenuVo> selectParentMenus();

    /**
     * 统计子菜单数量
     */
    Long countByParentId(@Param("parentId") Long parentId);

    /**
     * 检查菜单编码是否存在
     */
    Boolean existsByMenuCode(@Param("menuCode") String menuCode,
                            @Param("excludeId") Long excludeId);

    /**
     * 批量更新启用状态
     */
    int batchUpdateEnabled(@Param("ids") List<Long> ids,
                          @Param("enabled") Boolean enabled,
                          @Param("updateTime") Long updateTime);

    /**
     * 根据权限标识查询菜单
     */
    List<YunkeMenu> selectByPermission(@Param("permission") String permission);

    /**
     * 查询最大排序号
     */
    Integer selectMaxSortOrder(@Param("parentId") Long parentId);

    /**
     * 更新菜单级别
     */
    int updateMenuLevel(@Param("id") Long id, @Param("level") Integer level);

    /**
     * 递归查询所有子菜单ID
     */
    List<Long> selectChildrenIds(@Param("parentId") Long parentId);
} 